Software typically changes over its useful lifetime. New versions of software are created to change or improve functionality, to add functionality, to correct coding errors, improve performance, to adapt to new hardware and for many other well-known reasons. The process of delivering new versions of software to users is called servicing the software.
A typical operating system does not know what executable software resides on the machine nor does it know what system or software resources are needed by the software to execute. It follows, therefore, that the operating system can have no knowledge of how or if one piece of software depends on another and will be unable to determine if a particular piece of software will run. This state of affairs makes it difficult to properly service software. For example, in the course of installing new software, one version of a program relied on by an existing piece of software may be overwritten with a new version, rendering the existing piece of software inoperable. The operating system is unable to prevent this from happening because it does not know that the existing piece of software needs a different version of the program.